﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Windows.Forms;

namespace GestionBudget.Objects
{
    public class Profil : ObjectPersistent
    {
        private const string NOM_FICHIER_XML = "profils.xml";

        private int identifiant;
        private string nom;
        private string prenom;
        private Devise devise;

        public static Profil Creer()
        {
            Profil nouveauProfil = new Profil();
            DictionnaireDonnees.ListeProfils.Add(nouveauProfil);
            return nouveauProfil;
        }

        private Profil()
        {
            this.devise = DictionnaireDonnees.ListeDevises.First();
            nom = "Nom";
            prenom = "Prénom";
            SetEstNouveauTrue();
        }

        private Profil(string identifiant, string nom, string prenom, string identifiantDevise)
        {
            this.identifiant = Convert.ToInt32(identifiant);

            if (Convert.ToInt32(identifiantDevise) > 0)
            {
                this.devise = DictionnaireDonnees.ListeDevises.First(sc => sc.Identifiant.ToString().Equals(identifiantDevise));
            }

            this.nom = nom;
            this.prenom = prenom;
        }

        public int Identifiant
        {
            get { return identifiant; }
        }

        public string Nom
        {
            get { return (!string.IsNullOrEmpty(nom) ? nom : String.Empty); }
            set 
            {
                if (nom != value)
                {
                    SetEstModifieTrue();
                }

                nom = value; 
            }
        }

        public string Prenom
        {
            get { return (!string.IsNullOrEmpty(prenom) ? prenom : String.Empty); }
            set 
            {
                if (prenom != value)
                {
                    SetEstModifieTrue();
                }

                prenom = value; 
            }
        }

        public Devise Devise
        {
            get 
            {
                return devise; 
            }
            set 
            {
                if (devise != value)
                {
                    SetEstModifieTrue();
                }
                devise = value;
            }
        }

        public List<SousCategorie> ListeSousCategorie
        {
            get
            {
                return DictionnaireDonnees.ListeSousCategories.Where(sc => sc.Profil.ToString().Equals(this.ToString())).ToList();
            }
        }

        public List<Transaction> ListeTransaction
        {
            get
            {
                return DictionnaireDonnees.ListeTransactions.Where(sc => sc.Profil.ToString().Equals(this.ToString())).ToList();
            }
        }

        static public List<Profil> ChargerListe()
        {
            CreerFichier(NOM_FICHIER_XML, "Profils");
            try
            {
                List<Profil> ListeProfils = new List<Profil>();
                XElement xelement = XElement.Load(NOM_FICHIER_XML);

                IEnumerable<XElement> profils = xelement.Elements();

                foreach (var profil in profils)
                {
                    Profil nouveauProfil = new Profil(profil.Element("identifiant").Value,
                                                                        profil.Element("nom").Value,
                                                                        profil.Element("prenom").Value,
                                                                        profil.Element("identifiantDevise").Value);
                    ListeProfils.Add(nouveauProfil);
                }

                return ListeProfils;
            }
            catch (Exception e)
            {
                MessageBox.Show("Une erreur est survenue lors du chargement des profils; " + e.Message,"Attention",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
                return null;
            }
        }

        public override void Sauvegarder()
        {
            CreerFichier(NOM_FICHIER_XML, "Profils");
            try
            {
                if (this.EstModifie || this.EstNouveau)
                {
                    XDocument xDocument = XDocument.Load(NOM_FICHIER_XML);

                    if (this.EstNouveau)
                    {
                        if (this.Identifiant == 0)
                        {
                            AttribuerIdentifiant();
                        }

                        xDocument.Root.Add(new XElement("Profil", new XElement("identifiant", this.identifiant.ToString()),
                                                                        new XElement("nom", this.nom),
                                                                        new XElement("prenom", this.prenom),
                                                                        new XElement("identifiantDevise", this.devise.Identifiant.ToString())));
                    }
                    else if (this.EstModifie)
                    {
                        IEnumerable<XElement> profils = xDocument.Elements();
                        XElement elementProfil = (from profil in profils.Elements()
                                                       where profil.Element("identifiant").Value.Equals(this.Identifiant.ToString())
                                                       select profil).First();

                        elementProfil.Element("nom").Value = this.nom;
                        elementProfil.Element("prenom").Value = this.prenom;
                        elementProfil.Element("identifiantDevise").Value = this.devise.Identifiant.ToString();
                    }

                    xDocument.Save(NOM_FICHIER_XML);

                    base.Sauvegarder();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Une erreur est survenue lors de la sauvegarde d'un profil; " + e.Message,"Attention",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
            }
        }

        public override void Supprimer()
        {
            if (!this.EstNouveau)
            {
                try
                {
                    XDocument xDocument = XDocument.Load(NOM_FICHIER_XML);
                    IEnumerable<XElement> profils = xDocument.Elements();
                    XElement elementProfil = (from profil in profils.Elements()
                                                   where profil.Element("identifiant").Value.Equals(this.Identifiant.ToString())
                                                   select profil).First();
                    elementProfil.Remove();
                    xDocument.Save(NOM_FICHIER_XML);
                }
                catch (Exception e)
                {
                    MessageBox.Show("Une erreur est survenue lors de la suppression d'un profil; " + e.Message,"Attention",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
                }
            }
            foreach (ObjectPersistent sousCategorie in this.ListeSousCategorie)
            {
                sousCategorie.Supprimer();
            }
            foreach (ObjectPersistent transaction in this.ListeTransaction)
            {
                transaction.Supprimer();
            }
            DictionnaireDonnees.ListeProfils.Remove(this);
            this.Dispose();
        }

        public override void AttribuerIdentifiant()
        {
            if (this.identifiant == 0)
            {
                this.identifiant = DictionnaireDonnees.ListeProfils.OrderBy(profil => profil.Identifiant).Last().Identifiant + 1;
            }
        }

        public override string ToString()
        {
            return Identifiant.ToString();
        }

        public override void Dispose()
        {
            base.Dispose();
        }
    }
}
